package br.com.livrossociais.dao.impl.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import javax.persistence.Query;

import br.com.livrossociais.dao.IRoleDAO;
import br.com.livrossociais.jpa.dao.RoleJPA;
import br.com.livrossociais.jpa.dao.RoleJPAImpl;
import br.com.livrossociais.model.Mensagem;
import br.com.livrossociais.model.Role;

public class RoleDAOHibernate implements IRoleDAO {
	private RoleJPA roleDAO;

	public RoleDAOHibernate() {
		// TODO Auto-generated constructor stub
		this.roleDAO = new RoleJPAImpl();
	}

	@Override
	public Mensagem cadastrar(Role r) {
		String name = r.getName();
		if (this.buscarRole(name) == null) {
			if (this.salvar(r)) {
				return Mensagem.Save_Efetuado;
			} else {
				return Mensagem.Erro_Save;
			}
		} else {
			return Mensagem.Role_Ja_Existe;
		}
	}

	@Override
	public Role buscarRole(String role) {
		// TODO Auto-generated method stub
		Role r = null;
		EntityManagerFactory emf = Persistence
				.createEntityManagerFactory("dev");
		EntityManager em = emf.createEntityManager();
		try {
			Query consulta = em.createNamedQuery("Role.findByName")
					.setParameter("role", role);
			r = (Role) consulta.getSingleResult();
		} catch (Exception e) {
			return null;
		} finally {
			em.close();
		}
		return r;
	}

	private boolean salvar(Role r) {
		try {
			this.roleDAO.beginTransaction();
			this.roleDAO.save(r);
			this.roleDAO.commit();
		} catch (Exception e) {
			return false;
		} finally {
			this.roleDAO.close();
		}
		return true;
	}
}
